package cn.kgc.websocket;

import cn.hutool.core.collection.CollUtil;
import io.netty.channel.Channel;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 维护用户对应的Channel信息
 */
public class UserChannelSession {
    //key:userId  Value:是用户当前所有存活的Channel集合
    private final static Map<String, List<Channel>> multiSession = new HashMap<>();

    public static void putMultiChannels(String userId, Channel channel) {
        //根据用户的id获得当前用户的所有channel通道
        List<Channel> channels = multiSession.get(userId);
        if (CollUtil.isEmpty(channels)) {
            //如果用户没有通道创建新的通道
            channels = CollUtil.newArrayList();
        }
        //向通道集合中添加新的通道
        channels.add(channel);
        //将通道集合放入到map中
        multiSession.put(userId, channels);
    }

    /**
     * 根据用户的id获得所有的channel
     */
    public static List<Channel> getMultiChannels(String userId) {
        return multiSession.get(userId);
    }

    //key:channelId  Value:是用户id
    //假设用户A 现在使用手机端和平板端和服务器建立链接（服务端需要记录两个channel）。
    //如果用户关闭了手机端的APP, 服务端移除掉手机端的链接(channel)
    //在服务器中如何能够知道关闭channel是哪个用户的呢?
    //key是channelId  value是用户的ID
    //根据关闭的channelId获得对应的用户ID,根据用户ID可以获得用户原来拥有的channel集合。
    //从channel集合中移除掉被关闭的channel,那么channel集合剩下存储的就是所有存活的Channel。
    static final Map<String, String> singleSession = new HashMap<>();

    //根据用户id和channelId将两者关联起来
    public static void putUserChannelIdRelation(String userId, String channelId) {
        singleSession.put(channelId, userId);
    }

    //根据channelId获得对应的用户ID
    public static String getUserId(String channelId) {
        return singleSession.get(channelId);
    }

    /**
     * 从用户的ID对应的所有通道中删除用户关闭的通道
     */
    public static void removeUselessChannel(String channelId) {
        //根据channel对应的用户ID
        String userId = getUserId(channelId);


        //假设A 拥有一个通道
        //获得用户所有的通道
        List<Channel> multiChannels = getMultiChannels(userId);
       //用户A 把这个通道关掉  用户A所拥有的  没有关闭的通道就是空的集合

        //从通道集合中移除掉关闭的通道
        multiChannels.removeIf(channel -> channel.id().asLongText().equals(channelId));

        //将没有关闭的通道保存到multiSession中 key是用户的id  value是用户拥有的通道

        //如果用户拥有的  没有关闭的通道集合是空的  不需要将这个空集合保存起来
        if(CollUtil.isEmpty(multiChannels)) {
            multiSession.remove(userId);
            return;
        }
        //如果用户拥有的没有关闭的通道集合不是空的 把集合重新保存到Map中
        multiSession.put(userId, multiChannels);
        //移除掉 用户对应的channelId关系
        singleSession.remove(channelId);
    }

    /**
     * 打印用户Id  以及用户Id所对应的channelId
     */
    public  static  void  print(){
        multiSession.forEach((k,v)->{
            System.out.println("******************************");
            System.out.println("用户id:"+k);
            v.forEach(channel -> {
                System.out.println("用户id对应的通道id:"+channel.id().asLongText());
            });
            System.out.println("******************************");
        });
    }
}
